//package com.angel.bo.auth.client.config.security.jwt;
//
//import com.alibaba.fastjson.JSON;
//import com.angel.bo.admin.config.security.JwtInfo;
//import com.angel.bo.beans.admin.entity.User;
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.SignatureAlgorithm;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.stereotype.Component;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.function.Function;
//
///**
// * @author zhangwei
// * jwt token 工具类
// */
//@Component
//public class DefaultJwtTokenUtil implements JwtTokenUtil {
//
//    /**
//     * 秘钥
//     */
////    @Value("${jwt.secret}")
//    private String secret = "UG9wdVRlYWNoZXI=";
//
//    /**
//     * 有效时间,单位秒
//     */
//    @Value("${jwt.expiration}")
//    private Long expiration;
//
//    /**
//     * 获取token对应用户的账号
//     *
//     * @param token
//     * @return
//     */
//    public String getLoginNameFromToken(String token) {
//        return getClaimFromToken(token, Claims::getSubject);
//    }
//
//    public Date getIssuedAtDateFromToken(String token) {
//        return getClaimFromToken(token, Claims::getIssuedAt);
//    }
//
//    /**
//     * 获取token对应用户的账号
//     *
//     * @param token
//     * @return
//     */
//    @Override
//    public String getAccountFromToken(String token) {
//        return getClaimFromToken(token, Claims::getSubject);
//    }
//
//    /**
//     * 获取过期时间
//     *
//     * @param token
//     * @return
//     */
//    public Date getExpirationDateFromToken(String token) {
//        return getClaimFromToken(token, Claims::getExpiration);
//    }
//
//    public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
//        final Claims claims = getAllClaimsFromToken(token);
//        return claimsResolver.apply(claims);
//    }
//
//    /**
//     * 将token里的信息转为JwtInfo
//     *
//     * @param token
//     * @return
//     */
//    @Override
//    public JwtInfo getJwtInfoFromToken(String token) {
//        Claims allClaimsFromToken = getAllClaimsFromToken(token);
//        String json = JSON.toJSONString(allClaimsFromToken);
//        return JSON.parseObject(json, JwtInfo.class);
//    }
//
//    /**
//     * 解析token,获取token加密内容
//     *
//     * @param token
//     * @return
//     */
//    private Claims getAllClaimsFromToken(String token) {
//        return Jwts.parser()
//                .setSigningKey(secret)
//                .parseClaimsJws(token)
//                .getBody();
//    }
//
//    /**
//     * 校验token是否过期
//     *
//     * @param token
//     * @return
//     */
//    private Boolean isTokenExpired(String token) {
//        final Date expiration = getExpirationDateFromToken(token);
//        return expiration.before(new Date());
//    }
//
//    private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
//        return (lastPasswordReset != null && created.before(lastPasswordReset));
//    }
//
//    private Boolean ignoreTokenExpiration(String token) {
//        // here you specify tokens, for that the expiration is ignored
//        return false;
//    }
//
//    /**
//     * 生成token  已重构
//     *
//     * @param userDetails
//     * @return
//     */
//    @Override
//    public String generateToken(UserDetails userDetails) {
//        Map<String, Object> claims = new HashMap<>(10);
//        return doGenerateToken(claims, userDetails.getUsername());
//    }
//
//    /**
//     * 生成token  已重构
//     *
//     * @param jwtInfo 需要jwt加密的内容
//     * @return
//     */
//    public String generateToken(JwtInfo jwtInfo) {
//        String json = JSON.toJSONString(jwtInfo);
//        Map<String, Object> claims = JSON.parseObject(json, Map.class);
//        return doGenerateToken(claims, jwtInfo.getUserName());
//    }
//
//    /**
//     * 生成token  已重构
//     * JwtBuilder builder = Jwts.builder()
//     * .claim(String,Object)                           //自定义属性
//     * .setId(id)                                      // JWT_ID
//     * .setAudience("")                                // 接受者
//     * .setClaims(null)                                // 自定义属性
//     * .setSubject("")                                 // 主题
//     * .setIssuer("")                                  // 签发者
//     * .setIssuedAt(new Date())                        // 签发时间
//     * .setNotBefore(new Date())                       // 失效时间
//     * .setExpiration(long)                            // 过期时间
//     * .signWith(signatureAlgorithm, secretKey);       // 签名算法以及密匙
//     *
//     * @param claims
//     * @param subject
//     * @return
//     */
//    private String doGenerateToken(Map<String, Object> claims, String subject) {
//        final Date createdDate = new Date();
//        final Date expirationDate = calculateExpirationDate(createdDate);
//        return Jwts.builder()
//                .setClaims(claims)
//                .setSubject(subject)
//                .setIssuedAt(createdDate)
//                .setExpiration(expirationDate)
//                .signWith(SignatureAlgorithm.HS512, secret)
//                .compact();
//    }
//
//    /**
//     * 校验token是否能够刷新 todo 未重构,不能使用
//     *
//     * @param token
//     * @param lastPasswordReset
//     * @return
//     */
//    public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset) {
////        final Date created = getIssuedAtDateFromToken(token);
////        return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset)
////                && (!isTokenExpired(token) || ignoreTokenExpiration(token));
//        return (!isTokenExpired(token) || ignoreTokenExpiration(token));
//    }
//
//    /**
//     * 刷新token 已重构
//     *
//     * @param token
//     * @return
//     */
//    public String refreshToken(String token) {
//        final Date createdDate = new Date();
//        final Date expirationDate = calculateExpirationDate(createdDate);
//
//        final Claims claims = getAllClaimsFromToken(token);
//        claims.setIssuedAt(createdDate);
//        claims.setExpiration(expirationDate);
//
//        return Jwts.builder()
//                .setClaims(claims)
//                .signWith(SignatureAlgorithm.HS512, secret)
//                .compact();
//    }
//
//    /**
//     * 校验token是否可用 已重构
//     *
//     * @param token
//     * @param userDetails
//     * @return
//     */
//    @Override
//    public Boolean validateToken(String token, UserDetails userDetails) {
//        User user = (User) userDetails;
//        final String username = getLoginNameFromToken(token);
//        //final Date created = getIssuedAtDateFromToken(token);
//        //final Date expiration = getExpirationDateFromToken(token);
//        //目前只校验用户名和是否过期
//        return (username.equals(user.getLoginName()) && !isTokenExpired(token));
//    }
//
//    /**
//     * 根据当前时间和有效时间长度,计算过期时间 已重构
//     *
//     * @param createdDate
//     * @return
//     */
//    private Date calculateExpirationDate(Date createdDate) {
//        return new Date(createdDate.getTime() + expiration * 1000);
//    }
//}
